# _*_ encoding:utf-8 _*_
import  json
from django.shortcuts import render
from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from django.views.generic.base import View
from django.contrib.auth.hashers import make_password
from django.http import HttpResponse,HttpResponseRedirect
from pure_pagination import Paginator, EmptyPage, PageNotAnInteger

from .models import UserProfile,EmailVerifyRecord
from .forms import LoginForm,RegisterForm,ForgetForm,ModifyPwdForm,UploadImageForm,UserInfoForm,MbRegisterForm
from utils.email_send import send_register_email
from  utils.mixin_utils import LoginRequiredMixin
from operation.models import UserCourse,UserFavorite,UserMessage
from organization.models import CourseOrg,Teacher
from courses.models import Course
from .models import Banner
from  django.core.urlresolvers import reverse

# Create your views here.


class CutomBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username)|Q(email=username)|Q(password=password))
            if user.check_password(password):
                 return user
        except Exception as e:
            return  None


class ActiveUserView(View):
    def get(self,request, active_code):
         all_records = EmailVerifyRecord.objects.filter(code=active_code)  #通过code 查找验证码
         if all_records:  #判断all_records 是否为空
             for record in all_records:   #遍历所有的验证码
                 email = record.email     #通过record 取出邮箱
                 user = UserProfile.objects.get(email=email)   #通过UserProfile查找email
                 user.is_active = True   #用户激活
                 user.save()   #用户保存
         else:
             return render(request, "active_fail.html.html")
         return render(request, "login.html")  #跳转登陆界面


class ResisterView(View):
    def get(self,request):
        register_form = RegisterForm()
        return render(request, "register.html", {'register_form':register_form})

    def post(self,request):
        register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            user_name = request.POST.get("email", "")
            if UserProfile.objects.filter(email=user_name):#查询用户是否存在
                return render(request, "register.html", {"register_form":register_form,"msg": "用户已经存在"})
            pass_word = request.POST.get("password", "")
            user_profile = UserProfile()
            user_profile.username = user_name
            user_profile.email = user_name
            user_profile.is_active = False
            user_profile.password = make_password(pass_word)
            user_profile.save()
             #欢迎注册消息
            user_message = UserMessage()
            user_message.user = user_profile.id
            user_message.message = "欢迎注册慕学网在线网"
            user_message.save()

            send_register_email(user_name,"register")
            return render(request, "login.html")
        else:
            return  render(request, "register.html",{"register_form":register_form})


#手机注册功能
class MbResisterView(View):
    def get(self,request):
        mbregister_form = MbRegisterForm()
        return render(request, "mbregister.html", {'mbregister_form':mbregister_form})

    def post(self,request):
        mbregister_form = MbRegisterForm()
        if mbregister_form.is_valid(request.POST):
            pass


class LogoutView(View):
    """
    用户登出
    """
    def get(self,request):
         logout(request)

         return  HttpResponseRedirect(reverse("index"))


class LoginView(View):
    def get(self,request):
        return render(request, "login.html", {})

    def post(self,request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            user_name = request.POST.get("username", "")
            pass_word = request.POST.get("password", "")
            user = authenticate(username=user_name, password=pass_word)
            if user is not None:
                if user.is_active:
                   login(request, user)
                   return HttpResponseRedirect(reverse("index"))
                else:
                   return render(request, "login.html", {"msg": "用户未激活，请点击你的邮箱激活"})
            else:
                return render(request, "login.html", {"msg": "用户名或者密码错误"})
        else:
            return render(request, "login.html", {"login_form":login_form})


class ForgetPwdView(View):
       def get(self,request):
          forget_form = ForgetForm( )
          return render(request,"forgetpwd.html",{"forget_form":forget_form})

       def post(self,request):
           forget_form = ForgetForm(request.POST)#验证是否合法
           if forget_form.is_valid():#是否存在
               email = request.POST.get("email","")
               send_register_email(email,"forget")
               return render(request,"send_success.html")
           else:
               return render(request,"forgetpwd.html",{"forget_form":forget_form})


class ResetView(View):
     def get(self, request, active_code):
          all_records = EmailVerifyRecord.objects.filter(code=active_code)  # 通过code 查找验证码
          if all_records:  # 判断all_records 是否为空
               for record in all_records:  # 遍历所有的验证码
                 email = record.email  # 通过record 取出邮箱
                 return render(request,"password_reset.html",{"email":email})
          else:
              return render(request, "active_fail.html.html")
              return render(request, "login.html")  # 跳转登陆界面


class ModifyPwdView(View):
     """
     用户修改密码
     """
     def post(self,request):
         modify_form = ModifyPwdForm(request.POST)
         if modify_form.is_valid():
             pwd1 = request.POST.get("password1","")
             pwd2 = request.POST.get("password2","")
             email = request.POST.get("email", "")
             if pwd1 !=pwd2:
                 return render(request, "password_reset.html", {"email": email,"msg":"密码不一致"})
             user = UserProfile.objects.get(email=email)
             user.password = make_password(pwd2)
             user.save()

             return render(request,"login.html")
         else:
            email = request.POST.get("email", "")
            return render(request,"password_reset.html",{"email":email,"msg":"modify_form"})


class UserinfoView(LoginRequiredMixin,View):
    """
    用户个人信息
    """
    def get(self, request):
        return render(request, 'usercenter-info.html', {})

    def post(self, request):
        user_info_form = UserInfoForm(request.POST, instance=request.user)
        if user_info_form.is_valid():
            user_info_form.save()
            return HttpResponse('{"status":"success"}', content_type='application/json')
        else:
            return HttpResponse(json.dumps(user_info_form.errors), content_type='application/json')


class UploadImageView(LoginRequiredMixin,View):
    """
    用户修改头像
    """
    def post(self,request):
        #html页面  multipart/form-data" autocomplete="off" method="post"  参数设置好-》表单中form :用户上传的文件保存到UploadImageForm中
        image_form = UploadImageForm(request.POST,request.FILES)
        if image_form.is_valid():
            image = image_form.cleaned_data['image']
            request.user.image = image
            request.user.save()

            return HttpResponse('{"status":"success"}', content_type='application/json')

        else:
            return HttpResponse('{"status":"fail"}', content_type='application/json')


class UpdatePwdView(View):
    """
    个人中心用户修改密码
    """
    def post(self, request):
        modify_form = ModifyPwdForm(request.POST)
        if modify_form.is_valid():
            pwd1 = request.POST.get("password1", "")
            pwd2 = request.POST.get("password2", "")

            if pwd1 != pwd2:
                return HttpResponse('{"status":"fail","msg":"密码不一致"}', content_type='application/json')
            user = request.user
            user.password = make_password(pwd2)
            user.save()

            return HttpResponse('{"status":"success"}', content_type='application/json')
        else:
            return HttpResponse(json.dumps(modify_form.errors) ,content_type='application/json')


class SendEmailCodeView(LoginRequiredMixin,View):
    """
    发送邮箱验证码
    """
    def get(self,request):
        email = request.GET.get('email','')

        if UserProfile.objects.filter(email=email):
            return  HttpResponse('{"email":"邮箱已经存在"}', content_type='application/json')
        send_register_email(email,"update_email")

        return HttpResponse('{"status":"success"}', content_type='application/json')


class UpdateEmailView(LoginRequiredMixin,View):
    """
    修改个人邮箱
    """
    def post(self,request):
        email = request.POST.get('email','')
        code  = request.POST.get('code','')

        #进行数据库查询
        existed_records = EmailVerifyRecord.objects.filter(email=email,code=code,send_type='update_email' )

        if existed_records:
            user =request.user
            user.email = email
            user.save()
            return HttpResponse('{"status":"success"}', content_type='application/json')

        else:
             return HttpResponse('{"status":"验证码出错"}', content_type='application/json')


class MyCourseView(LoginRequiredMixin,View):
    """
    我的课程

    """

    def get(self,request):
        user_courses = UserCourse.objects.filter(user = request.user)
        return  render(request,'usercenter-mycourse.html',{

            "user_courses":user_courses
        })



class MyFavOrgView(LoginRequiredMixin,View):
    """
    我的收藏机构
    """
    def get(self,request):
        org_list = []
        fav_orgs = UserFavorite.objects.filter(user = request.user,fav_type=2)
        for fav_org in fav_orgs:
            org_id = fav_org.fav_id
            org = CourseOrg.objects.get(id=org_id)
            org_list.append(org)
        return  render(request, 'usercenter-fav-org.html',{
            "org_list":org_list
        })


class MyFavTeacherView(LoginRequiredMixin,View):
    """
    我的收藏讲师
    """
    def get(self,request):
        teacher_list = []
        fav_teachers = UserFavorite.objects.filter(user = request.user,fav_type=3)
        for fav_teacher in fav_teachers:
            teacher_id = fav_teacher.fav_id
            teacher = Teacher.objects.get(id=teacher_id)
            teacher_list.append(teacher)
        return  render(request, 'usercenter-fav-teacher.html',{
            "teacher_list":teacher_list
        })


class MyFavCoursesView(LoginRequiredMixin,View):
    """
    我的收藏课程
    """
    def get(self,request):
        courses_list = []
        fav_courses = UserFavorite.objects.filter(user = request.user,fav_type=1)
        for fav_teacher in fav_courses:
            courses_id = fav_teacher.fav_id
            courses = Course.objects.get(id=courses_id)
            courses_list.append(courses)
        return  render(request, 'usercenter-fav-course.html',{
            "courses_list":courses_list
        })


class MymessageView(LoginRequiredMixin,View):

    def get(self,request):
        all_message = UserMessage.objects.filter(user=request.user.id)
        #用户进入个人消息后清空未读消息的记录
        all_unread_message = UserMessage.objects.filter(user=request.user.id,has_read=False)
        for unread_message in all_unread_message:
            unread_message.has_read = True
            unread_message.save()
        #对个人消息进行分类
        try:
            page = request.GET.get('page', 1)

        except PageNotAnInteger:
            page = 1

        p = Paginator(all_message, 5, request=request)

        messages = p.page(page)

        return  render(request,'usercenter-message.html',{
          "messages":messages
        })


class IndexView(View):
    #慕学在线首页
    def get(self,request):
        all_banners = Banner.objects.all().order_by('index')
        courses = Course.objects.filter(is_banner=False)[:6]
        banner_courses = Course.objects.filter(is_banner=True)[:3]
        courses_orgs = CourseOrg.objects.all()[:15]
        return  render(request,'index.html',{
            'all_banners':all_banners,
            'courses':courses,
            'banner_courses':banner_courses,
            'courses_orgs':courses_orgs
        })


def page_not_found(request):
    #全局404页面配置
    from django.shortcuts import render_to_response
    response = render_to_response('404.html',{ })
    response.status_code = 404
    return response


def page_error(request):
    #全局404页面配置
    from django.shortcuts import render_to_response
    response = render_to_response('500.html',{ })
    response.status_code = 500
    return response

